package com.sh.rpc;

import com.sh.rpc.confige.RegistryConfig;
import com.sh.rpc.confige.RpcConfig;
import com.sh.rpc.constant.RpcConstant;
import com.sh.rpc.registry.Registry;
import com.sh.rpc.registry.RegistryFactory;
import com.sh.rpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * RPC 框架应用
 * @author sh
 */
@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;


    public static void init(){
        RpcConfig newRpcConfig;
        try {
            newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            log.warn("RPC配置初始化失败, 使用默认值");
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 初始化 rpcConfig
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("RPC配置初始化，配置为：{}", newRpcConfig.toString());

        // 初始化注册中心
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());  // 获取注册中心实例
        registry.init(registryConfig);
        log.info("注册中心初始化完成, 配置{}", registryConfig);

        // JVM 关闭时，销毁注册中心
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 获取 RPC 配置
     */
    public static RpcConfig getRpcConfig() {
        if ( rpcConfig==null ){
            synchronized (RpcApplication.class){
                if ( rpcConfig==null ){
                    init();
                }
            }
        }
        return rpcConfig;
    }


}
